package co.com.desarrollo.pedidos.services;

import java.util.List;

import co.com.desarrollo.pedidos.entities.DetallePedidoUsuario;
import co.com.desarrollo.pedidos.entities.EstadoPedido;
import co.com.desarrollo.pedidos.entities.PedidoGrupo;
import co.com.desarrollo.pedidos.entities.PedidoUsuario;
import co.com.desarrollo.pedidos.entities.Producto;
import co.com.desarrollo.pedidos.entities.Tienda;
import co.com.desarrollo.pedidos.entities.Usuario;
import co.com.desarrollo.pedidos.services.exceptions.DetallePedidoNotFoundException;
import co.com.desarrollo.pedidos.services.exceptions.EstadoPedidoNotFoundException;
import co.com.desarrollo.pedidos.services.exceptions.IllegalEstadoPedidoException;
import co.com.desarrollo.pedidos.services.exceptions.PedidoGrupoNotFoundException;
import co.com.desarrollo.pedidos.services.exceptions.PedidoUsuarioNotFoundException;
import co.com.desarrollo.pedidos.services.exceptions.ProductoNotFoundException;
import co.com.desarrollo.pedidos.services.exceptions.TiendaNotFoundException;
import co.com.desarrollo.pedidos.services.exceptions.UsuarioNotFoundException;

public interface PedidoService {
	
	/*PEDIDOGRUPO*/
	public PedidoGrupo getPedidoGrupoById(PedidoGrupo pedidoGrupo);
	public PedidoGrupo setPedidoGrupo(PedidoGrupo pedidoGrupo);
	public PedidoGrupo getPedidoGrupoByEstadoEsperaTienda(Tienda tienda) throws TiendaNotFoundException;
	public PedidoGrupo getPedidoGrupoByEstadoSolicitadoTienda(Tienda tienda) throws TiendaNotFoundException;
	public PedidoGrupo getPedidoGrupoByEstadoCanceladoTienda(Tienda tienda) throws TiendaNotFoundException;
	public PedidoGrupo getPedidoGrupoByEstadoEntregadoTienda(Tienda tienda) throws TiendaNotFoundException;
	public List<PedidoGrupo> getAllPedidosGrupo();
	public List<PedidoGrupo> getPedidosGrupoByEstadoPedido(EstadoPedido estadoPedido) throws EstadoPedidoNotFoundException;
	public PedidoGrupo realizarPedidoGrupo(PedidoGrupo pedidoGrupo, Usuario usuario)throws IllegalEstadoPedidoException, UsuarioNotFoundException, DetallePedidoNotFoundException, TiendaNotFoundException, PedidoGrupoNotFoundException;
	public PedidoGrupo cancelarPedidoGrupo(PedidoGrupo pedidoGrupo) throws IllegalEstadoPedidoException, DetallePedidoNotFoundException, TiendaNotFoundException, PedidoGrupoNotFoundException;
	public PedidoGrupo confirmarPedidoGrupo(PedidoGrupo pedidoGrupo) throws IllegalEstadoPedidoException, DetallePedidoNotFoundException, TiendaNotFoundException, PedidoGrupoNotFoundException;
	
	/*PEDIDOUSUARIO*/
	public PedidoUsuario getPedidoUsuarioById(PedidoUsuario pedidoUsuario);
	public List<PedidoUsuario> getPedidosUsuarioByUsuarioPedidoGrupo(Usuario usuario, PedidoGrupo pedidoGrupo) throws UsuarioNotFoundException, DetallePedidoNotFoundException, TiendaNotFoundException, PedidoGrupoNotFoundException;
	public PedidoUsuario getPedidoUsuarioActivoByUsuarioPedidoGrupo(Usuario usuario, PedidoGrupo pedidoGrupo) throws UsuarioNotFoundException, DetallePedidoNotFoundException, TiendaNotFoundException, PedidoGrupoNotFoundException;
	public List<PedidoUsuario> getPedidosUsuarioByUsuario(Usuario usuario);
	public List<PedidoUsuario> getPedidosUsuarioByPedidoGrupo(PedidoGrupo pedidoGrupo) throws DetallePedidoNotFoundException, TiendaNotFoundException, PedidoGrupoNotFoundException;
	public List<PedidoUsuario> getAllPedidosUsuario();
	public PedidoUsuario setPedidoUsuario(Usuario usuario, Tienda tienda) throws TiendaNotFoundException, UsuarioNotFoundException, DetallePedidoNotFoundException, PedidoGrupoNotFoundException;
	public void removePedidoUsuario(PedidoUsuario pedidoUsuario) throws IllegalEstadoPedidoException, TiendaNotFoundException, UsuarioNotFoundException, DetallePedidoNotFoundException, PedidoGrupoNotFoundException, PedidoUsuarioNotFoundException;
	public PedidoUsuario getPedidoUsuarioByTienda(Usuario usuario, Tienda tienda) throws TiendaNotFoundException, UsuarioNotFoundException, DetallePedidoNotFoundException, PedidoGrupoNotFoundException;
	
	/*DETALLEPEDIDO*/
	public DetallePedidoUsuario getDetallePedidoById(DetallePedidoUsuario detallePedidoUsuario);
	public DetallePedidoUsuario getDetallePedidoByPedidoUsuarioProducto(PedidoUsuario pedidoUsuario, Producto producto) throws ProductoNotFoundException, TiendaNotFoundException, UsuarioNotFoundException, DetallePedidoNotFoundException, PedidoGrupoNotFoundException, PedidoUsuarioNotFoundException;
	public List<DetallePedidoUsuario> getDetallePedidoByPedidoUsuario(PedidoUsuario pedidoUsuario)throws TiendaNotFoundException, UsuarioNotFoundException, DetallePedidoNotFoundException, PedidoGrupoNotFoundException, PedidoUsuarioNotFoundException;
	public List<DetallePedidoUsuario> getAllDetallePedidosUsuario();
	public DetallePedidoUsuario addDetallePedido(DetallePedidoUsuario detallePedidoUsuario, PedidoUsuario pedidoUsuario) throws IllegalEstadoPedidoException, TiendaNotFoundException, UsuarioNotFoundException, DetallePedidoNotFoundException, PedidoGrupoNotFoundException, PedidoUsuarioNotFoundException;
	public void removeDetallePedido(DetallePedidoUsuario detallePedidoUsuario) throws IllegalEstadoPedidoException, TiendaNotFoundException, UsuarioNotFoundException, DetallePedidoNotFoundException, PedidoGrupoNotFoundException, PedidoUsuarioNotFoundException, ProductoNotFoundException;
	
	/*FINDERS-BOTH*/
	public PedidoGrupo findPedidoGrupoMethods(PedidoGrupo pedidoGrupo) throws PedidoGrupoNotFoundException, TiendaNotFoundException, DetallePedidoNotFoundException;
	public PedidoUsuario findPedidoUsuarioMethods(PedidoUsuario pedidoUsuario) throws PedidoUsuarioNotFoundException, TiendaNotFoundException, UsuarioNotFoundException, DetallePedidoNotFoundException, PedidoGrupoNotFoundException;
	public DetallePedidoUsuario findDetallePedidoUsuarioMethods(DetallePedidoUsuario detallePedidoUsuario) throws DetallePedidoNotFoundException,TiendaNotFoundException, UsuarioNotFoundException, PedidoGrupoNotFoundException, PedidoUsuarioNotFoundException, ProductoNotFoundException;
	
}
